#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

// 系统重定向接口，实现下面的程序
int main() {
    int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
    dup2(fd, 1);
    printf("%d\n", fd);
    // fflush(stdout);

    const char* msg = "hello dup2\n";
    int cnt = 5;
    while (cnt--) {
        write(1, msg, strlen(msg));
    }
    // fflush(stdout);
    // 如果想要在字符串之后打印fd, 没有必要刷新; 想在之前打印，需要在写字符串之前刷新
    close(fd);  
    // 这里关闭了fd，但是1没有关闭，所以程序结束时刷新stdout的缓冲区，会写入文件。
    return 0;
}



// 下面就做到了将本来写到到显示器的文本写到了普通文件中，即：输出重定向

// 演示文件描述符分配规则，引出重定向
// int main() {
//     close(1);
//     printf("%d\n", fd);
//     // fflush(stdout); // 小问题：在写文件之前和写文件之后刷新缓冲区，这两者有什么区别？
// 
//     const char* msg = "hello linux!\n";
//     int cnt = 5;
//     while (cnt--) {
//         write(1, msg, strlen(msg));
//     }
//     fflush(stdout);
// 
//     close(fd);
//     return 0;
// }
